//*****************************************************************************
// 1. Års eksamen @ Datamatiker - EASJ
// Holmegaard Heldagsskole Administrations system 
// 
// Denne klasse er udarbejdet af: Marc og Kasper
//*****************************************************************************
package view.elev;

import control.ControlUtil;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import model.*;
import org.hibernate.NonUniqueObjectException;

public class KontaktPersonPanel extends javax.swing.JPanel {

    private boolean kperson_rediger, gemState;
    private ControlUtil controlUtil;
    private DefaultListModel kontaktpersonListen = new DefaultListModel();
    private DefaultListModel telefonListen = new DefaultListModel();
    private DefaultListModel filListen = new DefaultListModel();
    private Desktop desktop;
    private ArrayList<String> nyTelefon;


    public KontaktPersonPanel(ControlUtil controlUtil) {
        this.controlUtil = controlUtil;
        initComponents();
        gemState = false;
        nyTelefon = new ArrayList<String>();
        skiftKpersonMode(false);

    }

    public void hentElever() {

        int value = vaelgElev.getSelectedIndex();
        vaelgElev.removeAllItems();
        vaelgElev.setEnabled(true);
        vaelgElev.addItem("Vælg elev");
        Elev[] el = controlUtil.getElevHandler().hentElever();
        for (int i = 0; i < el.length; i++) {
            vaelgElev.addItem(el[i]);
        }
        vaelgElev.setSelectedIndex(value);
    }

    private void opdaterElev(Elev elev) {

        kontaktpersonListen.clear();
        Kontaktperson[] kperson = controlUtil.getElevHandler().hentKontaktPersonerElev(elev);
        for (int i = 0; i < kperson.length; i++) {
            kontaktpersonListen.addElement(kperson[i]);

        }


    }

    private void rydFelter() {
        relation.setSelectedIndex(0);
        primærværge.setSelected(false);
        fnavn_form.setText("");
        enavn.setText("");
        adresse.setText("");
        postnr.setText("");
        by.setText("");
        telefonListen.clear();
        filListen.clear();
    }

    private void opdaterKontaktPerson(Kontaktperson k) {

        relation.setSelectedIndex(Integer.parseInt(k.getKtype() + "") - 1);
        primærværge.setSelected(k.isVaerge());
        fnavn_form.setText(k.getFornavn());
        enavn.setText(k.getEfternavn());
        adresse.setText(k.getAdresse());
        postnr.setText(k.getPostnr().getPostNummer());
        by.setText(k.getPostnr().getByen());

        Iterator telefonIter = k.getKpersonTelefons().iterator();
        telefonListen.clear();
        while (telefonIter.hasNext()) {
            KpersonTelefon c = (KpersonTelefon) telefonIter.next();
            telefonListen.addElement(c);
        }

        KpersonFil[] kpf = controlUtil.getkPersonHandler().getKpersonFil(k);
        filListen.clear();
        for (int i = 0; i < kpf.length; i++) {
            filListen.addElement(kpf[i]);
        }
    }

    private void skiftKpersonMode(boolean changeto) {
        kperson_rediger = changeto;
        fnavn_form.setEditable(changeto);
        enavn.setEditable(changeto);
        adresse.setEditable(changeto);
        postnr.setEditable(changeto);
        relation.setEnabled(changeto);
        tilføj_telefon.setEnabled(changeto);
        fjern_telefon.setEnabled(changeto);
        nytTelefon_form.setEditable(changeto);
        primærværge.setEnabled(changeto);

    }

    private boolean skiftKpersonModeknap() {
        if (kperson_rediger == true) {
            kperson_rediger = false;
        } else {
            kperson_rediger = true;
        }
        sætGemTekst(kperson_rediger);
        return kperson_rediger;

    }

    private void sætGemTekst(boolean changeto) {
        if (changeto == true) {
            gem.setText("Gem oplysningerne");

        } else {
            gem.setText("Ændre oplysningerne");
        }
    }

    private void skiftStatusKnap(boolean to) {
        slet.setEnabled(to);
        tilføjfil_form.setEnabled(to);
        jButton5.setEnabled(to);
        jButton6.setEnabled(to);
        gem.setEnabled(to);
    }

    private char hentKtype() {
        int ktype = relation.getSelectedIndex() + 1;
        String g = ktype + "";

        return g.charAt(0);
    }

    private void sætPrimærVærgeCheckbox() {
        int i = relation.getSelectedIndex();

        if (i == 2 || i == 3 || i == 5) {


            primærværge.setEnabled(kperson_rediger);


        } else {
            primærværge.setSelected(false);
            primærværge.setEnabled(false);
        }
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        vaelgElev = new javax.swing.JComboBox();
        jLabel2 = new javax.swing.JLabel();
        fnavn_form = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        enavn = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        kontaktpersonList = new javax.swing.JList(kontaktpersonListen);
        opret = new javax.swing.JButton();
        gem = new javax.swing.JButton();
        slet = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        adresse = new javax.swing.JTextField();
        postnr = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        by = new javax.swing.JTextField();
        jLabel8 = new javax.swing.JLabel();
        relation = new javax.swing.JComboBox();
        jLabel9 = new javax.swing.JLabel();
        primærværge = new javax.swing.JCheckBox();
        jLabel10 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        filList = new javax.swing.JList(filListen);
        tilføjfil_form = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jButton6 = new javax.swing.JButton();
        jScrollPane3 = new javax.swing.JScrollPane();
        telefon = new javax.swing.JList(telefonListen);
        tilføj_telefon = new javax.swing.JButton();
        fjern_telefon = new javax.swing.JButton();
        jLabel11 = new javax.swing.JLabel();
        nytTelefon_form = new javax.swing.JTextField();

        setMaximumSize(new java.awt.Dimension(1016, 696));
        setMinimumSize(new java.awt.Dimension(1016, 696));
        setPreferredSize(new java.awt.Dimension(1016, 696));
        setLayout(null);

        jLabel1.setText("Vælg elev:");
        add(jLabel1);
        jLabel1.setBounds(10, 10, 80, 14);

        vaelgElev.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "vælg elev" }));
        vaelgElev.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                vaelgElevActionPerformed(evt);
            }
        });
        add(vaelgElev);
        vaelgElev.setBounds(10, 30, 190, 20);

        jLabel2.setText("Fornavn:");
        add(jLabel2);
        jLabel2.setBounds(290, 90, 80, 14);
        add(fnavn_form);
        fnavn_form.setBounds(290, 110, 110, 20);

        jLabel3.setText("Efternavn:");
        add(jLabel3);
        jLabel3.setBounds(420, 90, 80, 14);
        add(enavn);
        enavn.setBounds(420, 110, 110, 20);

        jLabel4.setText("Elevens kontaktpersoner:");
        add(jLabel4);
        jLabel4.setBounds(10, 70, 150, 14);

        kontaktpersonList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                kontaktpersonListValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(kontaktpersonList);

        add(jScrollPane1);
        jScrollPane1.setBounds(10, 90, 210, 360);

        opret.setText("Opret ny");
        opret.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                opretActionPerformed(evt);
            }
        });
        add(opret);
        opret.setBounds(10, 460, 90, 23);

        gem.setText("Ændre oplysningerne");
        gem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gemActionPerformed(evt);
            }
        });
        add(gem);
        gem.setBounds(270, 460, 170, 23);

        slet.setForeground(new java.awt.Color(255, 0, 0));
        slet.setText("slet");
        slet.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sletActionPerformed(evt);
            }
        });
        add(slet);
        slet.setBounds(130, 460, 73, 23);

        jLabel5.setText("Adresse:");
        add(jLabel5);
        jLabel5.setBounds(290, 140, 60, 14);
        add(adresse);
        adresse.setBounds(290, 160, 140, 20);

        postnr.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                postnrKeyReleased(evt);
            }
        });
        add(postnr);
        postnr.setBounds(290, 210, 59, 20);

        jLabel6.setText("Post Nr:");
        add(jLabel6);
        jLabel6.setBounds(290, 190, 60, 14);

        jLabel7.setText("By:");
        add(jLabel7);
        jLabel7.setBounds(290, 240, 100, 14);

        by.setEditable(false);
        add(by);
        by.setBounds(290, 260, 140, 20);

        jLabel8.setText("Telefon:");
        add(jLabel8);
        jLabel8.setBounds(290, 300, 70, 14);

        relation.setModel(new javax.swing.DefaultComboBoxModel(new String[] { " Psykolog", " Sagsbehandler", " Mor", " Far", " Pædagog", " Plejeforældre" }));
        relation.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                relationActionPerformed(evt);
            }
        });
        add(relation);
        relation.setBounds(290, 50, 160, 20);

        jLabel9.setText("Kontaktpersonens relation");
        add(jLabel9);
        jLabel9.setBounds(290, 30, 190, 14);

        primærværge.setText("Primærværge");
        add(primærværge);
        primærværge.setBounds(460, 50, 120, 23);

        jLabel10.setText("Filer tilknyttet kontaktpersonen:");
        add(jLabel10);
        jLabel10.setBounds(640, 40, 250, 14);

        jScrollPane2.setViewportView(filList);

        add(jScrollPane2);
        jScrollPane2.setBounds(640, 60, 350, 390);

        tilføjfil_form.setText("Tilføj fil");
        tilføjfil_form.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tilføjfil_formActionPerformed(evt);
            }
        });
        add(tilføjfil_form);
        tilføjfil_form.setBounds(640, 460, 110, 30);

        jButton5.setText("Åben fil");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });
        add(jButton5);
        jButton5.setBounds(790, 460, 100, 30);

        jButton6.setText("Slet fil");
        jButton6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton6ActionPerformed(evt);
            }
        });
        add(jButton6);
        jButton6.setBounds(920, 460, 73, 30);

        jScrollPane3.setViewportView(telefon);

        add(jScrollPane3);
        jScrollPane3.setBounds(290, 320, 150, 120);

        tilføj_telefon.setText("Tilføj");
        tilføj_telefon.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tilføj_telefonActionPerformed(evt);
            }
        });
        add(tilføj_telefon);
        tilføj_telefon.setBounds(450, 370, 70, 23);

        fjern_telefon.setText("Fjern");
        fjern_telefon.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fjern_telefonActionPerformed(evt);
            }
        });
        add(fjern_telefon);
        fjern_telefon.setBounds(450, 410, 70, 23);

        jLabel11.setText("Tilføj Telefon");
        add(jLabel11);
        jLabel11.setBounds(450, 320, 110, 14);
        add(nytTelefon_form);
        nytTelefon_form.setBounds(450, 340, 100, 20);
    }// </editor-fold>//GEN-END:initComponents

    private void tilføjfil_formActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tilføjfil_formActionPerformed

        JFileChooser chooser = new JFileChooser();

        int status = chooser.showOpenDialog(null);
        if (status == JFileChooser.APPROVE_OPTION) {

            File file = chooser.getSelectedFile();
            Kontaktperson kperson = (Kontaktperson) kontaktpersonList.getSelectedValue();
            KpersonFil kpfile = new KpersonFil(new KpersonFilId(kperson.getKontaktId(), file.getPath()), kperson);
            controlUtil.getkPersonHandler().OpretKpersonFil(kpfile);
            hentElever();

            opdaterKontaktPerson(kperson);
        }




    }//GEN-LAST:event_tilføjfil_formActionPerformed

    private void vaelgElevActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vaelgElevActionPerformed

        if (vaelgElev.getSelectedIndex() > 0 && vaelgElev.getItemCount() != 0) {
            if (kperson_rediger == true && gemState == false) {
                skiftKpersonMode(false);
            }
            opret.setEnabled(true);
            Elev elev = (Elev) vaelgElev.getSelectedItem();
            kontaktpersonList.setSelectedIndex(-1);
            opdaterElev(elev);
        } else {
            opret.setEnabled(false);
            kontaktpersonListen.clear();
        }
        skiftStatusKnap(false);
    }//GEN-LAST:event_vaelgElevActionPerformed

    private void kontaktpersonListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_kontaktpersonListValueChanged

        if (kperson_rediger == true && gemState == false) {
            skiftKpersonMode(false);
        }

        if (kontaktpersonList.getSelectedIndex() > -1) {
            Kontaktperson k = (Kontaktperson) kontaktpersonList.getSelectedValue();
            opdaterKontaktPerson(k);
            skiftStatusKnap(true);
        } else {
            rydFelter();
            skiftStatusKnap(false);
        }
    }//GEN-LAST:event_kontaktpersonListValueChanged

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed
        if (Desktop.isDesktopSupported()) {
            desktop = Desktop.getDesktop();
            try {
                KpersonFil kpf = (KpersonFil) filList.getSelectedValue();
                desktop.open(new File(kpf.getId().getFil()));
            } catch (IOException ex) {
                Logger.getLogger(KontaktPersonPanel.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


    }//GEN-LAST:event_jButton5ActionPerformed

    private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed
        KpersonFil fil = (KpersonFil) filList.getSelectedValue();

        controlUtil.getkPersonHandler().sletKpersonFil(fil);
        opdaterKontaktPerson(fil.getKontaktperson());
    }//GEN-LAST:event_jButton6ActionPerformed

    private void gemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gemActionPerformed
        boolean error = false;
        ArrayList<String> errors = new ArrayList<String>();
        Postnr g = controlUtil.getkPersonHandler().hentPostnr(postnr.getText());

        if (g.getPostNummer().equals("0000")) {
            error = true;
            errors.add("Postnr");
        }

        if (!error) {
            if (kperson_rediger == true) {
                //SAVE HERE
                if (kontaktpersonList.getSelectedIndex() == -1) {
                    // ny

                    Kontaktperson kperson = new Kontaktperson(controlUtil.getkPersonHandler().hentPostnr(postnr.getText()), fnavn_form.getText(), enavn.getText(), adresse.getText(), hentKtype(), primærværge.isSelected());
                    Elev elev = (Elev) vaelgElev.getSelectedItem();

                    elev.getKontaktpersons().add(kperson);
                    for (int i = 0; i < nyTelefon.size(); i++) {
                        kperson.getKpersonTelefons().add(nyTelefon.get(i));

                    }

                    controlUtil.getkPersonHandler().nyKperson(kperson);
                    nyTelefon.clear();


                } else {
                    gemState = true;
                    // rediger
                    Kontaktperson kperson = (Kontaktperson) kontaktpersonList.getSelectedValue();
                    kperson.setFornavn(fnavn_form.getText());
                    kperson.setEfternavn(enavn.getText());
                    kperson.setAdresse(adresse.getText());
                    kperson.setVaerge(primærværge.isSelected());

                    kperson.setPostnr(controlUtil.getkPersonHandler().hentPostnr(postnr.getText()));

                    kperson.setKtype(hentKtype());
                    hentElever();
                    opdaterElev((Elev) vaelgElev.getSelectedItem());
                    opdaterKontaktPerson(kperson);
                    gemState = false;
                }
            } else {
                Elev el = (Elev) vaelgElev.getSelectedItem();
                opdaterKontaktPerson((Kontaktperson) kontaktpersonList.getSelectedValue());
            }




            skiftKpersonMode(skiftKpersonModeknap());
        } else {
            String err = "Der var en fej med ";
            for (int i = 0; i < errors.size(); i++) {
                if (i != 0) {
                    err = err + ", ";
                }
                err = err + errors.get(i);

            }

            JOptionPane.showMessageDialog(this, err, "", JOptionPane.ERROR_MESSAGE);
        }


    }//GEN-LAST:event_gemActionPerformed

    private void relationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_relationActionPerformed
        sætPrimærVærgeCheckbox();
    }//GEN-LAST:event_relationActionPerformed

    private void sletActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sletActionPerformed
        Kontaktperson kperson = (Kontaktperson) kontaktpersonList.getSelectedValue();
        Elev elev = (Elev) vaelgElev.getSelectedItem();
        controlUtil.getkPersonHandler().sletkPerson(kperson);
        hentElever();
        opdaterElev(elev);
        opdaterKontaktPerson(kperson);
    }//GEN-LAST:event_sletActionPerformed

    private void tilføj_telefonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tilføj_telefonActionPerformed
        if (nytTelefon_form.getText().length() == 8) {
            try {
                int tlf = Integer.parseInt(nytTelefon_form.getText());
                if (kontaktpersonList.getSelectedIndex() == -1) {
                    nyTelefon.add(tlf + "");
                    telefonListen.addElement(nytTelefon_form.getText());


                } else {
                    Kontaktperson kperson = (Kontaktperson) kontaktpersonList.getSelectedValue();
                    KpersonTelefon kpt = new KpersonTelefon(new KpersonTelefonId(kperson.getKontaktId(), tlf + ""), kperson);
                    controlUtil.getkPersonHandler().OpretKpersonTelefon(kpt);
                    opdaterKontaktPerson(kperson);
                }
                nytTelefon_form.setText("");


            } catch (NumberFormatException ex) {
                String text = "Der må kun forekomme tal i et telefon nr.!";
                JOptionPane.showMessageDialog(this, text, "", JOptionPane.ERROR_MESSAGE);
            } catch (NonUniqueObjectException ex) {
                String text = "Det pågældende telefon nr. findes allerede";
                JOptionPane.showMessageDialog(this, text, "", JOptionPane.ERROR_MESSAGE);
            }
        } else if (nytTelefon_form.getText().length() != 0) {
            String text = "Telefon nummeret skal være på 8 tal.";
            JOptionPane.showMessageDialog(this, text, "", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_tilføj_telefonActionPerformed

    private void fjern_telefonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fjern_telefonActionPerformed
        if (telefon.getSelectedIndices().length == 1) {
            KpersonTelefon tlf = (KpersonTelefon) telefon.getSelectedValue();
            controlUtil.getkPersonHandler().sletKpersonTelefon(tlf);
            opdaterKontaktPerson(tlf.getKontaktperson());

        }
    }//GEN-LAST:event_fjern_telefonActionPerformed

    private void opretActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_opretActionPerformed
        rydFelter();
        kontaktpersonList.clearSelection();
        gem.setEnabled(true);
        skiftKpersonMode(true);
    }//GEN-LAST:event_opretActionPerformed

    private void postnrKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_postnrKeyReleased
        if (postnr.getText().length() == 0) {
            by.setText("");
        } else {
            by.setText(controlUtil.getkPersonHandler().hentPostnr(postnr.getText()).getByen());
        }
    }//GEN-LAST:event_postnrKeyReleased
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField adresse;
    private javax.swing.JTextField by;
    private javax.swing.JTextField enavn;
    private javax.swing.JList filList;
    private javax.swing.JButton fjern_telefon;
    private javax.swing.JTextField fnavn_form;
    private javax.swing.JButton gem;
    private javax.swing.JButton jButton5;
    private javax.swing.JButton jButton6;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JList kontaktpersonList;
    private javax.swing.JTextField nytTelefon_form;
    private javax.swing.JButton opret;
    private javax.swing.JTextField postnr;
    private javax.swing.JCheckBox primærværge;
    private javax.swing.JComboBox relation;
    private javax.swing.JButton slet;
    private javax.swing.JList telefon;
    private javax.swing.JButton tilføj_telefon;
    private javax.swing.JButton tilføjfil_form;
    private javax.swing.JComboBox vaelgElev;
    // End of variables declaration//GEN-END:variables
}